<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			// 不存在变量提升	
			//console.log(a);//a is not defined
			//let a = 10
			//经典面试题	
			// var
			var arr = [];
			for (var i = 0; i < 2; i++) {
				arr[i] = function() {
					// 变量i是全局的,函数执行时输出的都是全局作用域下的i值
					console.log(i);
				}
			}
			arr[0](); //2
			arr[1](); //2

			// let		
			let arr2 = [];
			for (let i = 0; i < 2; i++) {
				arr2[i] = function() {
					// 每次循环都会产生一个块级作用域,每个块级作用域中的变量都是不同的,
					// 函数执行时输出的是自己的上一级(循环产生的块级作用域)作用域下的i值			
					console.log(i);
				}
			}
			arr2[0](); //0
			arr2[1](); //1

			// const
			if (true) {
				const a = 10;
				if (true) {
					const a = 20;
					console.log(a); //20
				}
				console.log(a); //10
			}
			//console.log(a);//报错

			const ar = [100, 200];
			//内存地址不可能改，但是值内部的数据可以更改
			ar[0] = 111;
			ar[1] = 222;
			//console.log(ar);//[111, 222]
			//const ar = [1001, 2001];
			//console.log(ar);//报错

			// var let const区别
			// var:函数作用域,存在变量提升,值可更改
			// let:块级作用域.不存在变量提升,值可更改
			// const:块级作用域,不存在变量提升,值不可改

			// 解构赋值
			// 数组解构,变量与值一一对应,没有则为undefined
			let [a, b, c, d] = [1, 2, 3];
			console.log(a); //1
			console.log(b); //2
			console.log(c); //3
			console.log(d); //undefined

			// 对象解构1
			let person1 = {
				name: 'andy',
				age: 18,
				sex: '男'
			};
			let {
				name,
				age,
				sex
			} = person1;
			console.log(name); //andy
			console.log(age); //18
			console.log(sex); //男
			
			// 对象解构2	   
			let person2 = {
				name: 'Me',
				age: 20,
				sex: '男'
			};
			let {
				name: uname,
				age: uage,
				sex: usex
			} = person2;
			console.log(uname);//Me
			console.log(uage);//20
			console.log(usex);//男
		</script>
	</body>
</html>
